#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@File    :   generate_data.py    
@Contact :   raogx.vip@hotmail.com
@License :   (C)Copyright 2017-2018, Liugroup-NLPR-CASIA

@Modify Time      @Author    @Version    @Desciption
------------      -------    --------    -----------
2023/8/27 15:09   caijiahao      1.0         Bytedancer
'''

# import lib
import datetime
import uuid
import random
from ctypes.wintypes import POINT
from decimal import Decimal
from datetime import date, time, datetime, timedelta

import radar
import json


def generate_random_string():
    return uuid.uuid1().__str__()


def generate_random_bytes():
    return uuid.uuid1().bytes


def generate_random_int(min=10, max=20):
    return random.randint(min, max)


def generate_random_float(min=10, max=20):
    return random.random() * (max - min) + min


def generate_random_choice(choice):
    return random.choice(choice)


def generate_random_time():
    return radar.random_date('2021-01-01T00:00:00', '2025-01-01T00:00:00')


def generate_random_point():
    x = generate_random_int()
    y = generate_random_int()
    return POINT(x, y)


def generate_random_data(iter=1, db_type='mysql'):
    records = []
    for i in range(0, iter):
        data = {}
        if db_type == 'mysql':
            data = {
                "fvarchar": generate_random_string(),
                "fbigint": generate_random_int(),
                "fbigint_unsigned": generate_random_int(),
                "fbinary": generate_random_bytes(),
                "fbit": generate_random_int(),

                "fblob": generate_random_bytes(),
                "fbool_tinyint": generate_random_int(),
                "fchar": generate_random_string(),
                "fdate": generate_random_time(),
                "fdatetime": generate_random_time(),

                "fdecimal": generate_random_float(),
                "fdouble": generate_random_float(),
                "fdouble_precision": generate_random_float(),
                "fenum": generate_random_choice(['0', '1', '2', '3']),
                "ffloat": generate_random_float(),

                "fint": generate_random_int(),
                "fint_unsigned": generate_random_int(),
                "finteger": generate_random_int(),
                "finteger_unsigned": generate_random_int(),
                "flong_varbinary_mediumblob": generate_random_bytes(),

                "flong_varchar_mediumtext": generate_random_string(),
                "flongblob": generate_random_bytes(),
                "flongtext": generate_random_string(),
                "fmediumblob": generate_random_bytes(),
                "fmediumint": generate_random_int(),

                "fmediumint_unsigned": generate_random_int(),
                "fmediumtext": generate_random_string(),
                "fnumeric_decimal": generate_random_float(),
                "freal_double": generate_random_float(),
                "fset": generate_random_choice(['A', 'B', 'C', 'D', 'E']),

                "fsmallint": generate_random_int(),
                "fsmallint_unsigned": generate_random_int(),
                "ftext": generate_random_string(),
                "ftime": generate_random_time(),
                "ftimestamp": generate_random_time(),

                "ftinyblob": generate_random_bytes(),
                "ftinyint": generate_random_int(),
                "ftinyint_unsigned": generate_random_int(),
                "ftinytext": generate_random_string(),
                "fvarbinary": generate_random_bytes(),
                "fyear": generate_random_choice(['2023', '2024', '2025']),
                "fjson": json.dumps({'name': 'xpleaf'})
            }
        elif db_type == 'oracle':
            data = {
                "number_col": generate_random_int(),
                "integer_col": generate_random_int(),
                "smallint_col": generate_random_int(),
                "float_col": generate_random_float(),
                "binary_float_col": generate_random_float(),
                "binary_double_col": generate_random_float(),
                "char_col": generate_random_string(),
                "varchar2_col": generate_random_string(),
                "nchar_col": generate_random_int(),
                "nvarchar2_col": generate_random_int(),
                "clob_col": generate_random_string(),
                "nclob_col": generate_random_string(),
                "blob_col": generate_random_bytes(),
                "bfile_col": generate_random_bytes(),
                "date_col": generate_random_time(),
                "timestamp_col": generate_random_time(),
                "timestamp_tz_col": generate_random_time(),
                "timestamp_ltz_col": generate_random_time(),
                "raw_col": generate_random_bytes(),
                "long_raw_col": generate_random_bytes(),
                "interval_year_col": generate_random_choice(['2023', '2024', '2025']),
                "interval_day_col": generate_random_choice(['10', '11', '12']),
                "xmltype_col": generate_random_string(),
            }
        elif db_type == 'postgresql':
            data = {
                "smallint_col": generate_random_int(),
                "integer_col": generate_random_int(),
                "bigint_col": generate_random_int(),
                "decimal_col": generate_random_float(),
                "real_col": generate_random_float(),
                "double_col": generate_random_float(),
                "char_col": generate_random_string(),
                "varchar_col": generate_random_string(),
                "text_col": generate_random_string(),
                "bytea_col": generate_random_bytes(),
                "date_col": generate_random_time(),
                "time_col": generate_random_time(),
                "timestamp_col": generate_random_time(),
                "timestamptz_col": generate_random_time(),
                "interval_col": '1 hours 30 minutes',
                "boolean_col": generate_random_int(),
                "point_col": generate_random_point(),
                "line_col": "LINE '[(1,2),(3,4)]'",
                "lseg_col": "[(1, 2), (3, 4)]",
                "box_col": "((1, 2), (3, 4))",
                "path_col": "[(1, 2), (3, 4), (5, 6)]",
                "polygon_col": '((1, 2), (3, 4), (5, 6), (1, 2))',
                "circle_col": '<(1, 2), 3>',
                "cidr_col": '192.168.1.0/24',
                "inet_col": '192.168.1.1',
                "macaddr_col": '08:00:2b:01:02:03',
                "bit_col": generate_random_int(),
                "varbit_col": '101010',
                "tsvector_col": generate_random_string(),
                "tsquery_col": generate_random_string(),
                "uuid_col": generate_random_string(),
                "xml_col": '<root><element>Value</element></root>',
                "json_col": json.dumps({
                    "name": "John Doe",
                    "age": 30,
                    "city": "New York"
                }),
                "jsonb_col": json.dumps({
                    "name": "John Doe",
                    "age": 30,
                    "city": "New York"
                }),
                "int_array_col": [1, 2, 3, 4, 5],
                "text_array_col": ["apple", "banana", "cherry"]
            }
        elif db_type == 'sqlserver':
            data = {
                "tinyint_col": generate_random_int(),
                "smallint_col": generate_random_int(),
                "int_col": generate_random_int(),
                "bigint_col": generate_random_int(),
                "decimal_col": generate_random_float(),
                "numeric_col": generate_random_float(),
                "money_col": Decimal('1234.56'),
                "smallmoney_col": Decimal('1234.56'),
                "float_col": generate_random_float(),
                "real_col": generate_random_float(),
                "date_col": date(2024, 10, 15),
                "time_col": time(14, 30, 15),
                "datetime_col": datetime(2024, 10, 15, 14, 30, 15),
                "datetime2_col": datetime(2024, 10, 15, 14, 30, 15, 123456),
                "smalldatetime_col": datetime(2024, 10, 15, 14, 30),
                "datetimeoffset_col": datetime(2024, 10, 15, 14, 30, 0) + timedelta(hours=8),
                "char_col": generate_random_string(),
                "varchar_col": generate_random_string(),
                "text_col": generate_random_string(),
                "nchar_col": generate_random_string(),
                "nvarchar_col": generate_random_string(),
                "ntext_col": generate_random_string(),
                "binary_col": generate_random_bytes(),
                "varbinary_col": generate_random_string(),
                "image_col": generate_random_bytes(),
                "bit_col": generate_random_int(),
                "uniqueidentifier_col": uuid.uuid4(),
                "sql_variant_col": generate_random_int(),
                "xml_col": '<root><element>Value</element></root>',
                "hierarchyid_col": "/".encode(),
                "geography_col": POINT(120, 30),
                "geometry_col": POINT(120, 30),
            }
        records.append(data)

    return records
